
#include "bsp.h"

#define SPI_SCK_0()     gpio_bit_reset(GPIOF, GPIO_PIN_7) 
#define SPI_SCK_1()     gpio_bit_set(GPIOF, GPIO_PIN_7)

#define SPI_MOSI_0()    gpio_bit_reset(GPIOF, GPIO_PIN_9)
#define SPI_MOSI_1()    gpio_bit_set(GPIOF, GPIO_PIN_9)

#define SPI_DELAY()        // spi_delay()
#define READ_SPI_MISO()    spi_mosi_read()


/***************************************************************************************************
 * @fn      spi_mosi_read
 *
 * @brief   读取MOSI引脚状态
 *
 * @param   无
 *
 * @return  1是高电平，0是低电平
 */
static uint8_t spi_mosi_read(void) 
{
    if (gpio_input_bit_get(GPIOF, GPIO_PIN_8))
    {
        return 1;
    }
    
    return 0; 
}

///***************************************************************************************************
// * @fn      spi_delay
// *
// * @brief   SPI延时函数
// *
// * @param   无
// *
// * @return  无
// */
//static void spi_delay(void)
//{
//    volatile uint8_t cnt = 1;

//    while (cnt--)
//    {;}
//}

/***************************************************************************************************
 * @fn      spi_rw_byte
 *
 * @brief   SPI接口读写一个数据
 *
 * @param   write 从SPI接口写入的数据
 *
 * @return  SPI接口返回的信息
 */
uint8_t spi_rw_byte(uint8_t write)
{
    uint8_t i;
    uint8_t  read = 0;

    for(i = 0; i < 8; i++)
    {
        read <<= 1;

        SPI_SCK_0();
        if (write & 0x80)
        {
            SPI_MOSI_1();
        }
        else
        {
            SPI_MOSI_0();
        }
        SPI_DELAY();

        SPI_SCK_1();
        if (READ_SPI_MISO())
        {
            read |= 0x01;
        }
        SPI_DELAY();

        write <<= 1;
    }

    return read;
}

/***************************************************************************************************
 * @fn      spi_bus_init
 *
 * @brief   SPI接口初始化
 *
 * @param   无
 *
 * @return  无
 */
void spi_bus_init(void)
{
    /* 使能RCU相关时钟 */
    rcu_periph_clock_enable(RCU_GPIOF);   

    /* 配置PF7 */
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);          
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_7);    
    gpio_bit_set(GPIOF, GPIO_PIN_7);  /* 将PB13默认状态设置为高电平 */

    /* 配置PF8 MOSI 输入模式 */
    gpio_mode_set(GPIOF, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_8);  

    /* 配置PF9 MOSI 推挽输出 */
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);          
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_9); 
    gpio_bit_set(GPIOF, GPIO_PIN_9);  /* 将PB15默认状态设置为高电平 */
}
